#ifndef SQLHELPER_H
#define SQLHELPER_H

#include <QSqlDatabase>
#include <memory>
#include "content/SQLBase.h"
#include "content/BoostSQL.h"
#include "content/QSQLControl.h"
#include "src/pubimp.h"


namespace SQL {
    typedef enum Control_Tag{
        BOOST_MODE =(0u),
        QT_MODE ,
        THIRD,
        TAG_ALL
    }REQUEST_MODE;
    constexpr SQL::REQUEST_MODE current_mode = SQL::QT_MODE;
}

class SQLHelper
{
public:

    /**
     * @brief GetBlade
     * @return  blade分支的数据库
     * @details 获取blade
     */
    static SQLHelper* GetBlade(){
        static QMutex mutex;
        static QScopedPointer<SQLHelper> inst;
        if (Q_UNLIKELY(!inst)) {
            mutex.lock();
            if (!inst) {
                inst.reset(new SQLHelper);
            }
            mutex.unlock();
        }
        return inst.data();
    }

    static SQLHelper* GetDB(std::string db){
        static QMutex mutex;
        static QScopedPointer<SQLHelper> inst;
        if (Q_UNLIKELY(!inst)) {
            mutex.lock();
            if (!inst) {
                inst.reset(new SQLHelper(db));
            }
            mutex.unlock();
        }
        return inst.data();
    }

    /// 获取内部成员指针
//    std::shared_ptr<SQLBase> p() {
//        return _p_tr;
//    }

    std::shared_ptr<SQLBase> _p_tr;
    // std::shared_ptr<QSQLControl> _p_tr;

private:
    SQLHelper(){
        init();
    }
    SQLHelper(std::string db){
        init();
        _p_tr->setDB(db);
    }


    void init(){

        switch (SQL::current_mode) {
        case SQL::BOOST_MODE:
            // _p_tr.reset(new BoostSQL);
            break;
        case SQL::QT_MODE:
            _p_tr.reset(new QSQLControl);
            break;
        default:
            // _p_tr.reset(new SQLBase);
            break;
        }
    }
};

#endif // SQLHELPER_H
